home *** CD-ROM | disk | FTP | other *** search
- (*---------------------------------------------------------------------------
- :Program. M2Err
- :Author. Fridtjof Björn Siebert (Amok)
- :Address. Nobileweg 67, D-7000 Stuttgart-40
- :Phone. (0)711/822509
- :Shortcut. [fbs]
- :Version. 1.0
- :Date. 14.04.88
- :Copyright. PD, but of course contributions are wellcomed.
- :Language. Modula-II
- :Translator. M2Amiga
- :Imports. none.
- :Contents. Program to type compile-errors.
- :Remark. Usage: M2Err Source
- :Bugs. none known yet. I still don't know what c1455252H in Error-
- :Bugs. file means, but I guess it's not important.
- ---------------------------------------------------------------------------*)
-
- (*-------------------------------------------------------------------------*)
- (* ----------------- *)
- (* - - - - M 2 E R R - - - - - *)
- (* ----------------- *)
- (* *)
- (* © 1988 by Fridtjof Siebert *)
- (* Nobileweg 67 *)
- (* 7000 Stuttgart 40 (Stammheim) *)
- (* Germany *)
- (* Phone: (0)711/822509 *)
- (* *)
- (* Usage: *)
- (* M2Err Source *)
- (* *)
- (*-------------------------------------------------------------------------*)
-
- MODULE M2Err;
-
- (*------ Importlist: ------*)
-
- FROM SYSTEM IMPORT ADR,ADDRESS,BYTE,WORD,BITSET,SHIFT,CAST;
- FROM Arts IMPORT detectCtrlC,TermProcedure;
- FROM Arguments IMPORT NumArgs,GetArg;
- FROM Dos IMPORT Open,Close,Read,Write,FileHandlePtr,oldFile,newFile,Output;
- FROM Exec IMPORT AllocMem,FreeMem,MemReqSet,MemReqs;
- FROM InOut IMPORT WriteString,WriteLn,WriteCard;
- FROM Strings IMPORT first,last,Delete,Copy,Insert,Compare,Length,Occurs;
- FROM Conversions IMPORT ValToStr,StrToVal;
-
- (*------ Constants: ------*)
-
- CONST
- M2Errs = "s:Modula-2 Fehlermeldungen";
-
- (*------ Types: ------*)
-
- TYPE
- ArgStr = ARRAY[0..79] OF CHAR;
- String2 = ARRAY[0..1] OF CHAR;
-
- (*------ Variables: ------*)
-
- VAR
- argc: CARDINAL; (* count args *)
- SourceFile: ArgStr; (* The Modula-File *)
- ErrFile: ArgStr; (* The Error-File *)
- i,j: INTEGER; (* no special use *)
- ic,jc:CARDINAL; (* no special use *)
- il: ADDRESS;
- InBuffer: POINTER TO CARDINAL; (* Buffer for Input *)
- LongInBuf: POINTER TO ARRAY[0..15] OF LONGCARD;
- CharInBuf: POINTER TO ARRAY[0..1] OF CHAR;
- SInBuffer: POINTER TO ARRAY[0..255] OF CHAR;
- InH,SInH: FileHandlePtr; (* FileHandles for I/O *)
- len: LONGCARD; (* for saving Writes's result *)
- ok: BOOLEAN; (* for getting boolean results *)
- Errors: POINTER TO ARRAY [0..14FFH] OF LONGCARD; (* For Error-Msgs *)
- ErrorNum: POINTER TO ARRAY [0..29FFH] OF CARDINAL;
- ErrorTxt: POINTER TO ARRAY[0..53FFH] OF CHAR;
- Line: CARDINAL; (* this counts lines *)
- TextAdr,OldTextAdr: ADDRESS; (* Address in source *)
- ActLine: ARRAY[0..255] OF CHAR; (* The actual Line *)
- ActChr: CARDINAL;
- ErrAdr: ADDRESS;
- ErrCnt: CARDINAL; (* this counts errors *)
- CharAdr: ADDRESS;
- ReadChrCnt,ReadChrLen: CARDINAL; (* Variables for ReadChar *)
-
- (*----------------------- CleanUp ---------------------------------------*)
-
- PROCEDURE CleanUp();
-
- BEGIN
- (*------ Close Files: ------*)
-
- Close(InH);
- Close(SInH);
-
- (*------ Give Mem back: ------*)
-
- FreeMem(InBuffer,512+5500H);
-
- END CleanUp;
-
- (*---------------------- ReadChar ---------------------------------------*)
-
- PROCEDURE ReadChar(): CHAR;
-
- BEGIN
- IF ReadChrCnt=ReadChrLen THEN
- ReadChrLen := CARDINAL(Read(SInH,SInBuffer,256)); ReadChrCnt := 0;
- END;
- INC(ReadChrCnt);
- RETURN SInBuffer^[ReadChrCnt-1];
- END ReadChar;
-
- (*-------------------- WriteError ---------------------------------------*)
-
- PROCEDURE WriteErr(Number:CARDINAL);
-
- VAR
- i: LONGCARD;
- j: CARDINAL;
- P: POINTER TO LONGCARD;
-
- BEGIN
- i:=0; j:=0; ActLine := "";
- WHILE ErrorNum^[SHIFT(i,-1)+2]<Number DO
- P := ADR(ErrorTxt^[i]); i := P^;
- END;
- IF ErrorNum^[(i DIV 2)+2]=Number THEN
- WHILE ErrorTxt^[i+5]#CHAR(0) DO
- ActLine[j] := ErrorTxt^[i+6]; INC(i); INC(j);
- END;
- ELSE
- ActLine := "???";
- END;
- WriteString(ActLine);
- END WriteErr;
-
- (*------------------------- Start ---------------------------------------*)
-
- BEGIN
- detectCtrlC := FALSE; (* you mustn't stop this programme *)
-
- (*------ Get Commandline: ------*)
-
- argc := NumArgs();
- IF argc>1 THEN WriteString("Too many parameters"); WriteLn(); HALT; END;
-
- (*------ No Parameters? Then type Usage: ------*)
-
- IF argc=0 THEN
- WriteString("Usage:"); WriteLn;
- WriteString(" M2Err Source"); WriteLn;
- WriteLn;
- WriteString(" Source: The File which the errors are to be shown of."); WriteLn;
- WriteString(" © 1988 by Fridtjof Siebert, Nobileweg 67, D-7000 Stgt-40"); WriteLn;
- WriteString(" Phone: (0)711/822509"); WriteLn;
- HALT;
- END;
-
- (*------ Who's the author? ------*)
-
- WriteString(" M2Err -- 14. 4.88, © Fridtjof Siebert"); WriteLn;
-
- (*------ read parameter ------*)
-
- GetArg(1,SourceFile,j);
- ErrFile := SourceFile; Insert(ErrFile,last,"E");
-
- (*------ get Memory ------*)
-
- InBuffer := AllocMem(512+5500H,MemReqSet{chip});
- IF InBuffer=NIL THEN WriteString("Zu wenig Speicher !!!"); HALT END;
- LongInBuf := ADDRESS(InBuffer);
- CharInBuf := ADDRESS(InBuffer);
- SInBuffer := ADDRESS(ADDRESS(InBuffer) + 256);
- Errors := ADDRESS(ADDRESS(InBuffer)+512);
- ErrorNum := ADDRESS(Errors);
- ErrorTxt := ADDRESS(Errors);
-
- (*------ Read Errormessages: ------*)
-
- InH := Open(ADR(M2Errs),oldFile);
- IF InH=NIL THEN
- FreeMem(InBuffer,512+5500H);
- WriteString("Konnte Fehlermelmeldungen nicht öffnen."); WriteLn; HALT;
- END;
-
- len := Read(InH,Errors,5500H);
- Close(InH);
-
- (*------ Init Main Loop: ------*)
-
- ReadChrCnt := 0; ReadChrLen := 0; (* defaults for ReadChar *)
- Line := 0; (* this counts the lines *)
- CharAdr := 307;
- TextAdr := 0; (* the current Address in Source *)
- ErrCnt := 0; (* this counts the errors *)
-
- InH := Open(ADR(ErrFile),oldFile);
- IF InH=NIL THEN
- FreeMem(InBuffer,512+5500H);
- WriteString("Konnte Fehlerdatei nicht öffnen."); WriteLn; HALT;
- END;
-
- SInH := Open(ADR(SourceFile),oldFile);
- IF SInH=NIL THEN
- FreeMem(InBuffer,512+5500H);
- WriteString("Konnte Quelldatei nicht öffnen."); WriteLn; HALT;
- END;
-
- len := Read(InH,InBuffer,4); len := Read(InH,InBuffer,2); (* `AE' *)
-
- TermProcedure(CleanUp); detectCtrlC := TRUE;
-
- (*------ Main Loop: ------*)
-
- WHILE InBuffer^#0FFFFH DO
- len := Read(InH,InBuffer,2); (* `RR' *)
- len := Read(InH,InBuffer,4); (* Address in Source *)
- ErrAdr := ADDRESS(LongInBuf^[0]);
- IF TextAdr<ErrAdr THEN
- WHILE TextAdr<ErrAdr DO
- OldTextAdr := TextAdr;
- CharInBuf^ := "x"; ActChr := 0;
- REPEAT
- ActLine[ActChr] := ReadChar(); INC(ActChr);
- UNTIL ActLine[ActChr-1]=CHR(10); (* Until next LF *)
- ActLine[ActChr] := CHAR(0);
- INC(TextAdr,ActChr); INC(Line); CharAdr := 255;
- END;
- WriteString("-----"); WriteLn;
- WriteCard(Line,4); WriteString(":"); WriteString(ActLine);
- END;
- IF CharAdr#ErrAdr-OldTextAdr THEN
- CharAdr := ErrAdr-OldTextAdr;
- ActLine := " ";
- FOR il:=0 TO CharAdr+1 DO Insert(ActLine,last," ") END;
- Insert(ActLine,last,"|"); WriteString(ActLine); WriteLn;
- END;
- len := Read(InH,InBuffer,2); (* Error-Number *)
- WriteCard(InBuffer^,8); WriteString(": ");
- REPEAT
- WriteErr(InBuffer^); WriteString(" ");
- len := Read(InH,InBuffer,2); (* second Errornumber or endmark *)
- UNTIL (InBuffer^=0FFFFH) OR (InBuffer^=0C145H);
- WriteLn;
- INC(ErrCnt);
- END;
-
- WriteLn; WriteCard(ErrCnt,4); WriteString(" Fehler enthalten."); WriteLn;
-
- (*------ That's it! ------*)
-
- END M2Err.
-
- (*-------------------------------------------------------------------------*)
- (* *)
- (* I don't believe it !!! This was written within one day !!? or better *)
- (* one afternoon and one night. Thanks to AMSoft not documenting their *)
- (* fileformats for errorfiles and the errorlist. *)
- (* *)
- (*-------------------------------------------------------------------------*)
-